#ifndef _CASES
#define _CASES

#include <stdio.h>
#include <stdlib.h>
#include "Unite.h"

struct sCases
{
	int type_decor;
	int vie;
	int groupe_decor;
	Unite* lunite;
};
typedef struct sCases Cases;

/* Procédure : InitialisationCases 
Précondition : La case c doit être créée.
Postcondition: initialise la case, on met la valeur 0 (plaine) par défaut pour le type, 
	                                            0 pour le groupe du décor 
                                                   100 pour la vie du décor 
	                                     et on donne la valeur NULL au pointeur sur Unite (aucune unité sur la case) 
Paramètre en mode donnée-résultat : c */
void InitialisationCases(Cases *c);


/* Procédure : DestructionCases 
Précondition : c est bien initialisée.
Postcondition : remet les valeurs de la case par defaut. 
                Si une Unité se trouve sur la case alors on détruit l'unité avant de libérer la mémoire utilisée 
Paramètre en mode donnée-résultat : c */
void DestructionCases(Cases *c);


/* Procédure : DeplacementUniteCases 
Précondition : - cdepart, cfin sont bien initialisées 
               - cdepart possède une unité, cfin ne possède pas d'unité.
Postcondition : déplace l'unité se trouvant dans la cdépart vers la case cfin 
Paramètre en mode donnée-résultat : cdepart, cfin */
void DeplacementUniteCases (Cases * cdepart, Cases * cfin);


/* Fonction ActionUniteCases -> entier
Précondition : - u et element sont bien initialisés, 1<=action<=2
	       - u doit posséder une unité
	       - si l'action est égale à 2 (combat), element doit posséder une unité.
Postcondition : L'unité de la case u fait l'action que le joueur a demandé sur la case element.
               - retourne 2 si l'action est un combat et que l'unité sur la case element meurt.
	       - retourne 1 si l'action est un combat et que l'unité sur la case u meurt.
 	       - retourne 0 sinon.
Paramètre en mode donnée-résultat : u, element
Paramètre en mode donnée : action */ 
int ActionUniteCases(Cases * u,Cases * element,int action);


/* Procédure : ModificationDecor
Précondition : c est bien initialisé, 0<=équipe<=1, 0<=type<=15   
Postcondition: change le champ "type_decor" et l'équipe de la structure Cases
Paramètre en mode donnée : type, equipe
Paramètre en mode donnée-résultat : c
 */
void ModificationDecor (Cases * c, int type,int equipe);


/* Procédure : DestructionUniteCases 
Précondition : c est bien initialisée
Postcondition : détruit l'unité se trouvant dans la case 
Paramètre en mode donnée-résultat : c */
void DestructionUniteCases (Cases * c);


/* Procédure : CreationUniteCases 
Précondition : c est bien initialisé, 0<=équipe<=1, 0<=type<=15 
Postcondition: alloue la structure Unite dans le tas et appel la procédure CreationUnite pour l'initialiser 
Paramètre en mode donnée : type, equipe
Paramètre en mode donnée-résultat : c */
void CreationUniteCases (Cases * c, int type, int equipe);

/* Procédure CasesTestRegression() 
Précondition : aucune
Postcondition : teste toutes les fonctions, procédures du module Cases */
void CasesTestRegression();

#endif
